package com.smslib.util;



import org.omg.CORBA.Object;

import org.smslib.AGateway;

import org.smslib.IOutboundMessageNotification;

import org.smslib.Library;

import org.smslib.OutboundMessage;

import org.smslib.Service;

import org.smslib.modem.SerialModemGateway;



import java.util.ArrayList;

import java.util.List;

import javax.crypto.spec.SecretKeySpec;

import org.smslib.AGateway.GatewayStatuses;

import org.smslib.AGateway.Protocols;

import org.smslib.ICallNotification;

import org.smslib.IGatewayStatusNotification;

import org.smslib.IInboundMessageNotification;

import org.smslib.IOrphanedMessageNotification;

import org.smslib.InboundMessage;

import org.smslib.InboundMessage.MessageClasses;

import org.smslib.Message.MessageTypes;

import org.smslib.crypto.AESKey;





public class SmsService {

	



	/**

	 * @Title: SendMessage

	 * @Description: TODO(���͵�һ)

	 * @param sPhonenumber

	 * @param sContext

	 * @throws Exception

	 */

	public void SendMessage(String sPhonenumber, String sContext)

			throws Exception {

		OutboundNotification outboundNotification = new OutboundNotification();

		System.out.println("Example: Send message from a serial gsm modem.");

		System.out.println(Library.getLibraryDescription());

		System.out.println("Version: " + Library.getLibraryVersion());

		/*

		 * modem.com1:���ID��������è�˿ڱ�ţ�

		 * COM4:������ƣ���window����COMXX��ʾ�˿���ƣ���linux,unixƽ̨����ttyS0

		 * -N��ttyUSB0-N��ʾ�˿���ƣ���ͨ��˿ڼ�����õ����õĶ˿�

		 * 115200������ÿ�뷢����ݵ�bitλ��,����������ȷ�ſ������Ͷ��ţ���ͨ�������м�⡣���õ���115200��9600

		 * Huawei

		 * ������è����̣���ͬ�Ķ���è�����smslib���װ��ATָ��ӿڻ᲻һ�£�����������ȷ.�������Huawei��wavecom�ȳ���

		 * ���һ�������ʾ�豸���ͺţ���ѡ

		 */

		SerialModemGateway gateway = new SerialModemGateway("modem.com1",

				"COM4", 115200, "wavecom", ""); // ��Ҫ�ĳ�wavecom���̣�

		gateway.setInbound(true); // ����true����ʾ����ؿ��Խ��ն���,��������޸�

		gateway.setOutbound(true);// ����true����ʾ����ؿ��Է��Ͷ���,��������޸�

		gateway.setSimPin("0000");// sim����һ��Ĭ��Ϊ0000��1234

		// Explicit SMSC address set is required for some modems.

		// Below is for VODAFONE GREECE - be sure to set your own!



		gateway.setSmscNumber("+306942190000");// ���ŷ������ĺ��� �ǲ����޸ĳ��й��ƶ���



		Service.getInstance().setOutboundMessageNotification(

				outboundNotification); // ���Ͷ��ųɹ���Ļص�������

		Service.getInstance().addGateway(gateway); // �������ӵ�����è������

		Service.getInstance().startService(); // �������񣬽�����ŷ��;���״̬

		System.out.println();

		// ��ӡ�豸��Ϣ

		System.out.println("Modem Information:");

		System.out.println("  Manufacturer: " + gateway.getManufacturer());

		System.out.println("  Model: " + gateway.getModel());

		System.out.println("  Serial No: " + gateway.getSerialNo());

		System.out.println("  SIM IMSI: " + gateway.getImsi());

		System.out.println("  Signal Level: " + gateway.getSignalLevel()

				+ " dBm");

		System.out.println("  Battery Level: " + gateway.getBatteryLevel()

				+ "%");

		System.out.println();

		// Send a message synchronously.

		OutboundMessage msg = new OutboundMessage(sPhonenumber, sContext); // ����1���ֻ����

																			// ����2����������

		Service.getInstance().sendMessage(msg); // ִ�з��Ͷ���

		System.out.println(msg);

		// Or, send out a WAP SI message.

		// OutboundWapSIMessage wapMsg = new

		// OutboundWapSIMessage("306974000000",

		// new URL("http://www.smslib.org/"), "Visit SMSLib now!");

		// Service.getInstance().sendMessage(wapMsg);

		// System.out.println(wapMsg);

		// You can also queue some asynchronous messages to see how the

		// callbacks

		// are called...

		// msg = new OutboundMessage("309999999999", "Wrong number!");

		// srv.queueMessage(msg, gateway.getGatewayId());

		// msg = new OutboundMessage("308888888888", "Wrong number!");

		// srv.queueMessage(msg, gateway.getGatewayId());

		System.out.println("Now Sleeping - Hit <enter> to terminate.");

		System.in.read();

		Service.getInstance().stopService();



	}



	public void SendMutiMessage(String[] sPhonenumber, String[] sContext)

			throws Exception {

		OutboundNotification outboundNotification = new OutboundNotification();

		System.out.println("Example: Send message from a serial gsm modem.");

		System.out.println(Library.getLibraryDescription());

		System.out.println("Version: " + Library.getLibraryVersion());

		/*

		 * modem.com1:���ID��������è�˿ڱ�ţ�

		 * COM4:������ƣ���window����COMXX��ʾ�˿���ƣ���linux,unixƽ̨����ttyS0

		 * -N��ttyUSB0-N��ʾ�˿���ƣ���ͨ��˿ڼ�����õ����õĶ˿�

		 * 115200������ÿ�뷢����ݵ�bitλ��,����������ȷ�ſ������Ͷ��ţ���ͨ�������м�⡣���õ���115200��9600

		 * Huawei

		 * ������è����̣���ͬ�Ķ���è�����smslib���װ��ATָ��ӿڻ᲻һ�£�����������ȷ.�������Huawei��wavecom�ȳ���

		 * ���һ�������ʾ�豸���ͺţ���ѡ

		 */

		SerialModemGateway gateway = new SerialModemGateway("modem.com1",

				"COM4", 115200, "wavecom", "");

		gateway.setInbound(true); // ����true����ʾ����ؿ��Խ��ն���,��������޸�

		gateway.setOutbound(true);// ����true����ʾ����ؿ��Է��Ͷ���,��������޸�

		gateway.setSimPin("0000");// sim����һ��Ĭ��Ϊ0000��1234

		// Explicit SMSC address set is required for some modems.

		// Below is for VODAFONE GREECE - be sure to set your own!

		gateway.setSmscNumber("+306942190000");// ���ŷ������ĺ��� �ǲ����޸ĳ��й��ƶ���

		Service.getInstance().setOutboundMessageNotification(

				outboundNotification); // ���Ͷ��ųɹ���Ļص�������

		Service.getInstance().addGateway(gateway); // �������ӵ�����è������

		Service.getInstance().startService(); // �������񣬽�����ŷ��;���״̬

		System.out.println();

		// ��ӡ�豸��Ϣ

		System.out.println("Modem Information:");

		System.out.println("  Manufacturer: " + gateway.getManufacturer());

		System.out.println("  Model: " + gateway.getModel());

		System.out.println("  Serial No: " + gateway.getSerialNo());

		System.out.println("  SIM IMSI: " + gateway.getImsi());

		System.out.println("  Signal Level: " + gateway.getSignalLevel()

				+ " dBm");

		System.out.println("  Battery Level: " + gateway.getBatteryLevel()

				+ "%");

		System.out.println();

		// Send a message synchronously.

		// OutboundMessage msg = new OutboundMessage(sPhonenumber, sContext);

		// //����1���ֻ���� ����2����������

		for (int i = 0; i <= sPhonenumber.length && i <= sContext.length; i++) {

			OutboundMessage msg = new OutboundMessage(sPhonenumber[i],

					sContext[i]); // ����1���ֻ���� ����2����������

			Service.getInstance().sendMessage(msg); // ִ�з��Ͷ���

			System.out.println(msg);



			// ���Ǽ�����ʱ���~�Է��������г�ͻ��

		}

	}



	/**

	 * @Title: readMessage

	 * @Description: TODO(��ȡ����Ϣ)

	 * @throws Exception 

	 */ 

	public void readMessage() throws Exception {

		// Define a list which will hold the read messages.����һ�����ű���list

		List<InboundMessage> msgList;

		// Create the notification callback method for inbound & status report

		// messages.

		InboundNotification inboundNotification = new InboundNotification();

		// Create the notification callback method for inbound voice calls.

		CallNotification callNotification = new CallNotification();

		// Create the notification callback method for gateway statuses.

		GatewayStatusNotification statusNotification = new GatewayStatusNotification();

		OrphanedMessageNotification orphanedMessageNotification = new OrphanedMessageNotification();

		try {

			System.out

					.println("Example: Read messages from a serial gsm modem.");

			System.out.println(Library.getLibraryDescription());

			System.out.println("Version: " + Library.getLibraryVersion());

			// Create the Gateway representing the serial GSM modem.

			SerialModemGateway gateway = new SerialModemGateway("modem.com4",

					"COM4", 115200, "wavecom", "E160");

			// Set the modem protocol to PDU (alternative is TEXT). PDU is the

			// default, anyway...

			gateway.setProtocol(Protocols.PDU);

			// Do we want the Gateway to be used for Inbound messages?

			gateway.setInbound(true);

			// Do we want the Gateway to be used for Outbound messages?

			gateway.setOutbound(true);

			// Let SMSLib know which is the SIM PIN.

			gateway.setSimPin("0000");

			// Set up the notification methods.

			Service.getInstance().setInboundMessageNotification(

					inboundNotification);

			Service.getInstance().setCallNotification(callNotification);

			Service.getInstance().setGatewayStatusNotification(

					statusNotification);

			Service.getInstance().setOrphanedMessageNotification(

					orphanedMessageNotification);

			// Add the Gateway to the Service object.

			Service.getInstance().addGateway(gateway);

			// Similarly, you may define as many Gateway objects, representing

			// various GSM modems, add them in the Service object and control

			// all of them.

			// Start! (i.e. connect to all defined Gateways)

			Service.getInstance().startService();

			// Printout some general information about the modem.

			System.out.println();

			System.out.println("Modem Information:");

			System.out.println("  Manufacturer: " + gateway.getManufacturer());

			System.out.println("  Model: " + gateway.getModel());

			System.out.println("  Serial No: " + gateway.getSerialNo());

			System.out.println("  SIM IMSI: " + gateway.getImsi());

			System.out.println("  Signal Level: " + gateway.getSignalLevel()

					+ " dBm");

			System.out.println("  Battery Level: " + gateway.getBatteryLevel()

					+ "%");

			System.out.println();

			// In case you work with encrypted messages, its a good time to

			// declare your keys.

			// Create a new AES Key with a known key value.

			// Register it in KeyManager in order to keep it active. SMSLib will

			// then automatically

			// encrypt / decrypt all messages send to / received from this

			// number.

			Service.getInstance()

					.getKeyManager()

					.registerKey(

							"+306948494037",

							new AESKey(new SecretKeySpec("0011223344556677"

									.getBytes(), "AES")));

			// Read Messages. The reading is done via the Service object and

			// affects all Gateway objects defined. This can also be more

			// directed to a specific

			// Gateway - look the JavaDocs for information on the Service method

			// calls.

			msgList = new ArrayList<InboundMessage>();

			Service.getInstance().readMessages(msgList, MessageClasses.ALL);

			for (InboundMessage msg : msgList)

				System.out.println(msg);

			// Sleep now. Emulate real world situation and give a chance to the

			// notifications

			// methods to be called in the event of message or voice call

			// reception.

			System.out.println("Now Sleeping - Hit <enter> to stop service.");

			System.in.read();

			System.in.read();

		} catch (Exception e) {

			e.printStackTrace();

		} finally {

			Service.getInstance().stopService();

		}

	}



	public class InboundNotification implements IInboundMessageNotification {

		public void process(AGateway gateway, MessageTypes msgType,

				InboundMessage msg) {

			if (msgType == MessageTypes.INBOUND)

				System.out

						.println(">>> New Inbound message detected from Gateway: "

								+ gateway.getGatewayId());

			else if (msgType == MessageTypes.STATUSREPORT)

				System.out

						.println(">>> New Inbound Status Report message detected from Gateway: "

								+ gateway.getGatewayId());

			System.out.println(msg);

		}

	}



	public class CallNotification implements ICallNotification {

		public void process(AGateway gateway, String callerId) {

			System.out.println(">>> New call detected from Gateway: "

					+ gateway.getGatewayId() + " : " + callerId);

		}

	}



	public class GatewayStatusNotification implements

			IGatewayStatusNotification {

		public void process(AGateway gateway, GatewayStatuses oldStatus,

				GatewayStatuses newStatus) {

			System.out.println(">>> Gateway Status change for "

					+ gateway.getGatewayId() + ", OLD: " + oldStatus

					+ " -> NEW: " + newStatus);

		}

	}



	public class OrphanedMessageNotification implements

			IOrphanedMessageNotification {

		public boolean process(AGateway gateway, InboundMessage msg) {

			System.out.println(">>> Orphaned message part detected from "

					+ gateway.getGatewayId());

			System.out.println(msg);

			// Since we are just testing, return FALSE and keep the orphaned

			// message part.

			return false;

		}

	}

	

	/*

	 * ���ŷ��ͳɹ��󣬵��øýӿڡ��������Ͷ��ŵ���غͶ������ݶ��󴫸�process�ӿ�

	 */

	public class OutboundNotification implements IOutboundMessageNotification {

		public void process(AGateway gateway, OutboundMessage msg) {

			System.out.println("Outbound handler called from Gateway: "

					+ gateway.getGatewayId());

			System.out.println(msg);

		}

	}



	public static void main(String args[]) {

		SmsService app = new SmsService();

		try {

			app.SendMessage("08613598092133", "hello world~hello message cat!");

		} catch (Exception e) {

			e.printStackTrace();

		}

		System.out.println("123");

	}

	



}

